﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыОбъект
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class ПринятиеКУчетуНМА:ДокументОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public DateTime Дата {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public DateTime ПрефиксНомера {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*11*/ Номер {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public bool Проведен {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public V82.Перечисления/*Ссылка*/.ВидыОбъектовУчетаНМА ВидОбъектаУчета {get;set;}//Вид объекта учета
		[DataMember]
		[ProtoMember(10)]
		public DateTime ДатаПриобретения {get;set;}//Дата приобретения
		///<summary>
		///(Регл) Любая дополнительная информация
		///</summary>
		[DataMember]
		[ProtoMember(11)]
		public string/*(0)*/ Комментарий {get;set;}
		[DataMember]
		[ProtoMember(12)]
		public decimal/*(3.2)*/ КоэффициентБУ {get;set;}//Коэффициент (БУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(13)]
		public bool НачислятьАмортизациюБУ {get;set;}//Начислять амортизацию (БУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(14)]
		public bool НачислятьАмортизациюНУ {get;set;}//Начислять амортизацию (НУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(15)]
		public V82.СправочникиСсылка.НематериальныеАктивы НематериальныйАктив {get;set;}//Нематериальный актив
		[DataMember]
		[ProtoMember(16)]
		public decimal/*(10)*/ ОбъемПродукцииРаботДляВычисленияАмортизации {get;set;}//Объем продукции (работ) для исчисления амортизации в натуральных ед.
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(17)]
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(18)]
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(19)]
		public bool ОтражатьВБухгалтерскомУчете {get;set;}//Отражать в бухгалтерском учете
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(20)]
		public bool ОтражатьВНалоговомУчете {get;set;}//Отражать в налоговом учете
		[DataMember]
		[ProtoMember(21)]
		public V82.Перечисления/*Ссылка*/.ПорядокВключенияСтоимостиОСиНМАВСоставРасходовУСН ПорядокВключенияСтоимостиВСоставРасходовУСН {get;set;}//Порядок включения стоимости в состав расходов (УСН)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(22)]
		public decimal/*(6.2)*/ СпециальныйКоэффициентНУ {get;set;}//Понижающий коэффициент
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(23)]
		public V82.Перечисления/*Ссылка*/.СпособыНачисленияАмортизацииНМА СпособНачисленияАмортизацииБУ {get;set;}//Способ начисления амортизации (БУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(24)]
		public V82.Перечисления/*Ссылка*/.МетодыНачисленияАмортизации СпособНачисленияАмортизацииНУ {get;set;}//Метод начисления амортизации
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(25)]
		public V82.СправочникиСсылка.СпособыОтраженияРасходовПоАмортизации СпособОтраженияРасходов {get;set;}//Способ отражения расходов
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(26)]
		public V82.Перечисления/*Ссылка*/.СпособыПоступленияАктивов СпособПоступления {get;set;}//Способ поступления
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(27)]
		public decimal/*(4)*/ СрокПолезногоИспользованияБУ {get;set;}//Срок полезного использования, мес.
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(28)]
		public decimal/*(4)*/ СрокПолезногоИспользованияНУ {get;set;}//Срок полезного использования (НУ), мес.
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(29)]
		public decimal/*(4)*/ СрокПолезногоИспользованияУСН {get;set;}//Срок полезного использования (УСН), мес.
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(30)]
		public decimal/*(15.2)*/ СтоимостьБУ {get;set;}//Первоначальная стоимость (БУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(31)]
		public decimal/*(15.2)*/ СтоимостьВР {get;set;}//Первоначальная стоимость (ВР)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(32)]
		public decimal/*(15.2)*/ СтоимостьНУ {get;set;}//Первоначальная стоимость (НУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(33)]
		public decimal/*(15.2)*/ СтоимостьПР {get;set;}//Первоначальная стоимость (ПР)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(34)]
		public decimal/*(15.2)*/ СтоимостьУСН {get;set;}//Стоимость (сумма расходов УСН)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(35)]
		public decimal/*(15.2)*/ СуммаНачисленнойАмортизацииУСН {get;set;}//Сумма начисленной амортизации (УСН)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(36)]
		public object СчетНачисленияАмортизацииБУ {get;set;}//Счет начисления амортизации БУ
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(37)]
		public object СчетНачисленияАмортизацииНУ {get;set;}//Счет начисления амортизации (НУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(38)]
		public object СчетУчетаБУ {get;set;}//Счет учета (БУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(39)]
		public object СчетУчетаБУВнеоборотногоАктива {get;set;}//Счет учета БУВнеоборотного актива
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(40)]
		public object СчетУчетаНУ {get;set;}//Счет учета (НУ)
		///<summary>
		///(Регл)
		///</summary>
		[DataMember]
		[ProtoMember(41)]
		public object СчетУчетаНУВнеоборотногоАктива {get;set;}//Счет учета НУВнеоборотного актива
		[DataMember]
		[ProtoMember(42)]
		public V82.Перечисления/*Ссылка*/.ПорядокСписанияНИОКРНУ ПорядокСписанияНИОКРНаРасходыНУ {get;set;}//Порядок списания НИОКР на расходы (НУ)
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для Документов.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Document410(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_Number
						,_Fld9981RRef
						,_Fld10006
						,_Fld9982
						,_Fld23008
						,_Fld9984
						,_Fld9985
						,_Fld9986RRef
						,_Fld9987
						,_Fld9988RRef
						,_Fld9989RRef
						,_Fld9990
						,_Fld9991
						,_Fld10010RRef
						,_Fld9992
						,_Fld9993RRef
						,_Fld9994RRef
						,_Fld9983RRef
						,_Fld9995RRef
						,_Fld9996
						,_Fld9997
						,_Fld10008
						,_Fld9998
						,_Fld10012
						,_Fld9999
						,_Fld10011
						,_Fld10007
						,_Fld10009
						,_Fld10000RRef
						,_Fld10001RRef
						,_Fld10002RRef
						,_Fld10003RRef
						,_Fld10004RRef
						,_Fld10005RRef
						,_Fld27257RRef)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Номер
						,@ВидОбъектаУчета
						,@ДатаПриобретения
						,@Комментарий
						,@КоэффициентБУ
						,@НачислятьАмортизациюБУ
						,@НачислятьАмортизациюНУ
						,@НематериальныйАктив
						,@ОбъемПродукцииРаботДляВычисленияАмортизации
						,@Организация
						,@Ответственный
						,@ОтражатьВБухгалтерскомУчете
						,@ОтражатьВНалоговомУчете
						,@ПорядокВключенияСтоимостиВСоставРасходовУСН
						,@СпециальныйКоэффициентНУ
						,@СпособНачисленияАмортизацииБУ
						,@СпособНачисленияАмортизацииНУ
						,@СпособОтраженияРасходов
						,@СпособПоступления
						,@СрокПолезногоИспользованияБУ
						,@СрокПолезногоИспользованияНУ
						,@СрокПолезногоИспользованияУСН
						,@СтоимостьБУ
						,@СтоимостьВР
						,@СтоимостьНУ
						,@СтоимостьПР
						,@СтоимостьУСН
						,@СуммаНачисленнойАмортизацииУСН
						,@СчетНачисленияАмортизацииБУ
						,@СчетНачисленияАмортизацииНУ
						,@СчетУчетаБУ
						,@СчетУчетаБУВнеоборотногоАктива
						,@СчетУчетаНУ
						,@СчетУчетаНУВнеоборотногоАктива
						,@ПорядокСписанияНИОКРНаРасходыНУ)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Document410
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_Number	= @Номер
						,_Fld9981RRef	= @ВидОбъектаУчета
						,_Fld10006	= @ДатаПриобретения
						,_Fld9982	= @Комментарий
						,_Fld23008	= @КоэффициентБУ
						,_Fld9984	= @НачислятьАмортизациюБУ
						,_Fld9985	= @НачислятьАмортизациюНУ
						,_Fld9986RRef	= @НематериальныйАктив
						,_Fld9987	= @ОбъемПродукцииРаботДляВычисленияАмортизации
						,_Fld9988RRef	= @Организация
						,_Fld9989RRef	= @Ответственный
						,_Fld9990	= @ОтражатьВБухгалтерскомУчете
						,_Fld9991	= @ОтражатьВНалоговомУчете
						,_Fld10010RRef	= @ПорядокВключенияСтоимостиВСоставРасходовУСН
						,_Fld9992	= @СпециальныйКоэффициентНУ
						,_Fld9993RRef	= @СпособНачисленияАмортизацииБУ
						,_Fld9994RRef	= @СпособНачисленияАмортизацииНУ
						,_Fld9983RRef	= @СпособОтраженияРасходов
						,_Fld9995RRef	= @СпособПоступления
						,_Fld9996	= @СрокПолезногоИспользованияБУ
						,_Fld9997	= @СрокПолезногоИспользованияНУ
						,_Fld10008	= @СрокПолезногоИспользованияУСН
						,_Fld9998	= @СтоимостьБУ
						,_Fld10012	= @СтоимостьВР
						,_Fld9999	= @СтоимостьНУ
						,_Fld10011	= @СтоимостьПР
						,_Fld10007	= @СтоимостьУСН
						,_Fld10009	= @СуммаНачисленнойАмортизацииУСН
						,_Fld10000RRef	= @СчетНачисленияАмортизацииБУ
						,_Fld10001RRef	= @СчетНачисленияАмортизацииНУ
						,_Fld10002RRef	= @СчетУчетаБУ
						,_Fld10003RRef	= @СчетУчетаБУВнеоборотногоАктива
						,_Fld10004RRef	= @СчетУчетаНУ
						,_Fld10005RRef	= @СчетУчетаНУВнеоборотногоАктива
						,_Fld27257RRef	= @ПорядокСписанияНИОКРНаРасходыНУ
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Номер", Номер);
					Команда.Parameters.AddWithValue("ВидОбъектаУчета", ВидОбъектаУчета.Ключ());
					Команда.Parameters.AddWithValue("ДатаПриобретения", ДатаПриобретения);
					Команда.Parameters.AddWithValue("Комментарий", Комментарий);
					Команда.Parameters.AddWithValue("КоэффициентБУ", КоэффициентБУ);
					Команда.Parameters.AddWithValue("НачислятьАмортизациюБУ", НачислятьАмортизациюБУ);
					Команда.Parameters.AddWithValue("НачислятьАмортизациюНУ", НачислятьАмортизациюНУ);
					Команда.Parameters.AddWithValue("ОбъемПродукцииРаботДляВычисленияАмортизации", ОбъемПродукцииРаботДляВычисленияАмортизации);
					Команда.Parameters.AddWithValue("ОтражатьВБухгалтерскомУчете", ОтражатьВБухгалтерскомУчете);
					Команда.Parameters.AddWithValue("ОтражатьВНалоговомУчете", ОтражатьВНалоговомУчете);
					Команда.Parameters.AddWithValue("ПорядокВключенияСтоимостиВСоставРасходовУСН", ПорядокВключенияСтоимостиВСоставРасходовУСН.Ключ());
					Команда.Parameters.AddWithValue("СпециальныйКоэффициентНУ", СпециальныйКоэффициентНУ);
					Команда.Parameters.AddWithValue("СпособНачисленияАмортизацииБУ", СпособНачисленияАмортизацииБУ.Ключ());
					Команда.Parameters.AddWithValue("СпособНачисленияАмортизацииНУ", СпособНачисленияАмортизацииНУ.Ключ());
					Команда.Parameters.AddWithValue("СпособПоступления", СпособПоступления.Ключ());
					Команда.Parameters.AddWithValue("СрокПолезногоИспользованияБУ", СрокПолезногоИспользованияБУ);
					Команда.Parameters.AddWithValue("СрокПолезногоИспользованияНУ", СрокПолезногоИспользованияНУ);
					Команда.Parameters.AddWithValue("СрокПолезногоИспользованияУСН", СрокПолезногоИспользованияУСН);
					Команда.Parameters.AddWithValue("СтоимостьБУ", СтоимостьБУ);
					Команда.Parameters.AddWithValue("СтоимостьВР", СтоимостьВР);
					Команда.Parameters.AddWithValue("СтоимостьНУ", СтоимостьНУ);
					Команда.Parameters.AddWithValue("СтоимостьПР", СтоимостьПР);
					Команда.Parameters.AddWithValue("СтоимостьУСН", СтоимостьУСН);
					Команда.Parameters.AddWithValue("СуммаНачисленнойАмортизацииУСН", СуммаНачисленнойАмортизацииУСН);
					Команда.Parameters.AddWithValue("СчетНачисленияАмортизацииБУ", Guid.Empty);
					Команда.Parameters.AddWithValue("СчетНачисленияАмортизацииНУ", Guid.Empty);
					Команда.Parameters.AddWithValue("СчетУчетаБУ", Guid.Empty);
					Команда.Parameters.AddWithValue("СчетУчетаБУВнеоборотногоАктива", Guid.Empty);
					Команда.Parameters.AddWithValue("СчетУчетаНУ", Guid.Empty);
					Команда.Parameters.AddWithValue("СчетУчетаНУВнеоборотногоАктива", Guid.Empty);
					Команда.Parameters.AddWithValue("ПорядокСписанияНИОКРНаРасходыНУ", ПорядокСписанияНИОКРНаРасходыНУ.Ключ());
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Document410
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
	}
}